/*
 * funcionesEstructura.h
 *
 *  Created on: 26/09/2011
 *      Author: utn_so
 */

#ifndef FUNCIONESESTRUCTURA_H_
#define FUNCIONESESTRUCTURA_H_

#include "./estructuraFAT.h"

typedef struct est_sector{  /* defini esta estrucutura pero podemos retocarla para lo que nos convenga mas adelante */
	int32_t idsector;
	void* datos;
}sector_t;

typedef struct ListaRaiz {
  fat_entrada entradaRaiz;
 struct	nodoListaRaiz *siguiente;
}ListaRaiz;

typedef struct ListaRaiz *ptrLista;

typedef struct nodoListaNombre{
	char nombre[20];
	struct	nodoListaNombre *siguiente;
}t_ListaNom;

typedef t_ListaNom *ptrListaNom_t;


sector_t leerSector (const int32_t sectorLogico);
void grabarSector (const int32_t sectorLogico, sector_t *buffer);
int32_t crearCadenaClusters(int32_t *tablaFAT, int32_t cantidad, fat_BootSector bootSector);
int32_t obtenerClusterLibre(fat_BootSector bootSector);
void agregarClusters(int32_t *tablaFAT, int32_t cantidad, fat_BootSector bootSector, int32_t ultimoCluster);
int32_t removerClusters(int32_t *tablaFAT, int32_t numeroPrimerCluster, int32_t cantidad);
char * crearCluster(char *sector1,char* sector2,char *sector3,char *sector4,char* sector5,char * sector6,char* sector7,char*sector8);
fat_BootSector inicializarBootSector(void *sector,  fat_BootSector bootSector);
void agregarEntradaEnLista(ptrLista *lista, fat_entrada entrada);
void mostrarLista (ptrLista Lista);
void mostrarListaN (ptrLista Lista);
int32_t agregarAListaRaiz(ptrLista *lista,char *cluster);
uint16_t eliminarEntradalistaRaiz(ptrLista *listaRaiz,fat_entrada entrada);
int32_t cantidadDeClustersLibres(int32_t *tablaFat,fat_BootSector bootSector);
int32_t cantidadDeClustersOcupados(int32_t *tablaFat , fat_BootSector bootSector);
int32_t * inicializarTablaFAT(fat_BootSector bootSector);
int32_t inicializarFSISector(char *sector,  fat_informacion_Sector FSISector);
int32_t buscaNombreDevuelveClusterEnListaRaiz(ptrLista lista,char * nombre);
int32_t buscaNombreEnCluster(char * cluster,char * nombre);
int32_t hiLowCluster(fat_entrada entrada);
int32_t obtenerDirDelCluster(int32_t numeroCluster, fat_BootSector bootSector);
fat_entrada renameSFN(fat_entrada entrada,char *nombre);
fat_nombreLargo renameLFN(fat_nombreLargo  lfn ,char * nombre);
size_t leerArchivo(char * path ,ptrLista listaRaiz,fat_BootSector bootSector,int32_t *tablaFat,char *buff,off_t desde,size_t cantidadALeer);
int32_t esEntradaNombreValida(char entradaNombre[]);
int32_t estaEnMayuscula(char nombre[]);
int32_t buscarEntradasLibres(char *cluster,int32_t cantidadEntradas);
char* leerCluster(int32_t primerSector);
void grabarCluster(int32_t primerSector, char *contCluster);
int32_t buscaNombreDevuelveEntradaListaRaiz(ptrLista lista,char * nombre,fat_entrada *entradaSFN,fat_entrada *entradaLFN);
int32_t buscaNombreDevuelveEntrada(char * cluster , char * nombre, fat_entrada *entadaSFN,fat_nombreLargo *entradaLFN,int32_t *banderaNoLFN);
int32_t cambiarTamanio(fat_BootSector bootSector,char * path,int32_t nuevoTamanio,ptrLista listaRaiz,int32_t *tablaFat,int32_t *primerClusSiEsCero);
int32_t elementosListaRaiz(ptrLista listaRaiz);
int32_t pathValido(char *path,ptrLista listaRaiz,int32_t *sizeArchivo,int32_t *esArchivo);
void mostrarListadoFat32(const char *path,ptrListaNom_t *listaNom,ptrLista listaRaiz);
int32_t cambiarNombreFat32(char * path ,char * nuevoNombre);
int32_t crearDirectorioFat32(char *path);
int32_t crearArchivoFat32(char *path);
int32_t eliminarDirectorioFat32(const char *path);
int32_t clustersDeUnArchivo(int32_t *tablaFAT,int32_t primerClusterArch);
int32_t persistirTablaFat(int32_t offset);
int32_t pathValidoCluster(char *path,ptrLista listaRaiz,int32_t *sizeArchivo,int32_t *primerClusterArch,int32_t *clusterEntrada);
size_t leerArchivo1(char * path ,ptrLista listaRaiz,fat_BootSector bootSector,int32_t *tablaFat,char* buff,off_t desde,size_t cantidadALeer);
size_t escribirArchivo(char * path ,ptrLista listaRaiz,fat_BootSector bootSector,int32_t *tablaFat,char* buff,off_t desde,size_t cantidadAEscribir);
char *obtenerSFNDeEntrada(fat_entrada entrada);
int32_t buscaEntradaCambiaPrimerClusterListRaiz(char * nombre,int32_t primerClusterArch);
int32_t buscaEntradaCambiaTamanioListRaiz(char * nombre,int32_t nuevoTamanio);
int32_t agregarEntradaArchivoCache(char *Data);
int32_t escribirArchivoCache(char *BufferCache, char *nombreArchivo);
void imprimirCache();
#endif /* FUNCIONESESTRUCTURA_H_ */
